// https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/description/

package binarytree

// 思路：
// copilot自己的思路：
// 1. 如果当前节点为空，或者等于p或q，则返回当前节点。
// 2. 递归查找左子树和右子树的最低公共祖先。
// 3. 如果左子树和右子树都不为空，则当前节点就是最低公共祖先。
// 4. 如果左子树不为空，则返回左子树的最低公共祖先；否则返回右子树的最低公共祖先。
// 时间复杂度：O(n)，其中n是二叉树的节点数。每个节点最多被访问一次。
// 此处的关键是 root==p || root==q 的判断，这样可以避免重复访问节点。
// 这个地方之所以直接返回root，是因为如果当前节点就是p或q，那么对于子树而言，不管子树中有没有p或q，当前节点都是必须返回的目标节点。

func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode {
	if root == nil || root == p || root == q {
		return root
	}

	left := lowestCommonAncestor(root.Left, p, q)
	right := lowestCommonAncestor(root.Right, p, q)

	if left != nil && right != nil {
		return root
	}
	if left != nil {
		return left
	}
	return right
}
